草庐IT

C++ Templates 多态障碍

全部标签

c++ - 一组根据操作数类型而不同名称的函数可以在C语言中称为理论上的静态多态吗?

是否一组函数只做一个词但名称不同,如atoi、atol、atoll等理论上称为多态?例如,我有一个函数swap需要对不同类型的数据进行操作。所以我有一个函数/操作,我有不同的实现,但不幸的是,因为语言不支持使用相同的函数名称,为了获得这样的功能,我需要制作变体swap_i,swap_l、swap_f、swap_str等等,必须根据操作数手动调用它们。在设计代码时,人们会将其设计为一个函数,具有不同的实现,根据操作数调用。但在这种情况下,程序员而不是编译器需要对函数进行静态绑定(bind)。如果程序员用C++实现它,那么设计将是相同的(因为他/她遵循了OOD方法),但在这种情况下,静态绑

C++11 - 编译时多态性解决方案

假设我正在编写一个跨平台库,我必须以不同平台有不同行为的方式组织代码,并且这种行为(或定义)是在编译时根据平台选择的我的图书馆正在编译。在C++中执行此操作的“通常”方法是在编写方法或类时用大量#ifdef污染代码。方法的问题在于:源代码看起来真的很丑如果您支持3个平台,您的源代码大约比您真正需要的大3倍,这意味着您的编译器仍然需要解析和分析所有代码才能“看到”#ifdef不同的实现之间没有真正的区别,当代码库增长时很难维护,而当你只有3-4个平台时,它增长得非常快。由于C++11中有很多新特性,我想知道是否有什么改变,是否有新的选项。 最佳答案

c++ - QVariant 的多态性

我有两个这样的类:classFoo{public:Foo(inti):_i(i){}int_i;};Q_DECLARE_METATYPE(Foo*)classBar:publicFoo{public:Bar(inti,intj):Foo(i),_j(j){}int_j;};Q_DECLARE_METATYPE(Bar*)我的长凳是这样的:intmain(intargc,char*argv[]){QApplicationa(argc,argv);Bar*bar=newBar(10,11);QVariantvar=QVariant::fromValue(bar);Foo*foo=var.v

c++ - 使用不同的实现文件来实现多态是不是可以?

如果给定接口(interface)有多个所需的实现,但所需的具体实现在编译时就已知,那么简单地将make文件定向到同一header的不同实现文件是否错误?例如,如果有一个定义汽车的程序(Car.h)//Car.hclassCar{public:stringWhatCarAmI();}并且在构建时我们知道我们想要它是法拉利还是菲亚特,给每个相应的文件://Ferrari.cpp#include"Car.h"stringCar::WhatCarAmI(){return"Ferrari";}而对于另一种情况(不出所料)//Fiat.cpp#include"Car.h"stringCar::W

c++ - 为什么 dynamic_cast 可以用于非多态类型的向上转换?

参见here:dynamic_castcanonlybeusedwithpointersandreferencestoclasses(orwithvoid*).Itspurposeistoensurethattheresultofthetypeconversionpointstoavalidcompleteobjectofthedestinationpointertype.Thisnaturallyincludespointerupcast(convertingfrompointer-to-derivedtopointer-to-base),inthesamewayasalloweda

c++ - 传递返回多态 unique_ptr 的 lambda 作为函数指针

我想传递一个非捕获的lambda,它返回一个std::unique_ptr,作为std::unique_ptr(*)()类型的函数指针.但是,这仅在我将lambda的返回类型明确声明为std::unique_ptr时才有效。.为什么要明确说明返回类型?为什么它适用于std::function没有这个额外的返回类型?#include#includestructBase{virtual~Base()=default;};structDerived:Base{};structFailsForF2{usingFunction=std::add_pointer_t()>;FailsForF2(F

c++ - 多态性:成员访问和getter给出不同的结果

代码如下:#include#include#includeclassParent{public:virtualvoidwhatAmI(){std::coutvalue=10;sc.parent->whatAmI();std::coutvaluegetValue()它返回:Achild10valuefromChild0我已经阅读了有关对象切片的内容,并确保在child被切片后我会分配值10。我仍然不明白为什么直接字段访问和函数调用会给出不同的结果。谢谢。 最佳答案 这里没有切片-您正在通过指针访问。该行为是由于成员变量访问是不是多态的

c++ - 多态 unique_ptr 复制省略

我有以下代码适用于Clang5.0,但不适用于启用了C++14的Clang3.8:classBase{};classDerived:publicBase{};std::unique_ptrMakeDerived(){autoderived=std::make_unique();returnderived;}intmain(){autobase=MakeDerived();std::coutLiveSampleHere在这种情况下,由于复制省略,返回值在技术上是移动构建的吗?如果是这样,这是否意味着unique_ptr的移动构造函数旨在支持用户类类型的隐式向上转换?从cppreferen

c++ - 为什么删除的复制构造函数不允许使用其他具有多态类型的构造函数?

我想知道为什么这个程序不能编译(在msvc、gcc和clang上的行为相同):#includeusingnamespacestd;structAction{virtualvoidaction(){cout按照我的预期,删除的复制构造函数应该让其他ActionDecorator实例构造ActionDecorator,因为它是Action的多态类型。相反,我必须将ActionDecorator实例显式转换为Action&,因为编译器提示试图引用已删除的复制构造函数。是否有一些标准规则可以解释这种行为? 最佳答案 删除函数不会将其从重载决

C++:在不违反 SRP 的情况下向多态类层次结构添加方法?

我经常遇到一个设计问题。为了便于说明,我们假设我有一个多态类层次结构classA{public:virtual~A(){}...};classB:publicA{...};classC:publicB{...};classD:publicA{...};...我希望能够以多态方式打印这些类的实例,即每个类都有自己的打印方式。实现这一点的明显方法是添加virtualvoidprint(OutputStream&os)=0;进入基类并在每个子类中覆盖此方法。但是,如果类的原始职责与打印无关,这将给它们增加另一个职责,从而违反了SRP。.我的问题是:在不违反SRP的情况下实现所需行为的正确方法